import json
import os
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from datetime import datetime

from openai import OpenAI


def generate_resume_by_llm(prompt: str) -> dict:
    ai_client = OpenAI(
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    )

    result = ai_client.chat.completions.create(
        model="qwen-plus",
        messages=[
            {
                "role": "user",
                "content": prompt
            }
        ],
        temperature=0.6,
    )

    content = result.choices[0].message.content

    print(content)
    print(type(content))

    return json.loads(content)


def generate_word_resume(resume_info:dict):
    """
    解析resume_info,
    将resume_info 的字段(key),通过python-docx写入到word文件
    返回文件的路径
    """
    # 创建文档对象
    doc = Document()
    
    # 设置正文字体
    doc.styles['Normal'].font.name = 'Arial'
    doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
    
    # 添加标题 - 个人简历
    title = doc.add_heading('个人简历', level=1)
    title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    
    # 基本信息
    base_info = resume_info.get("base_info", {})
    if base_info:
        # 姓名
        name_para = doc.add_paragraph()
        name_run = name_para.add_run(f"姓名: {base_info.get('name', '')}")
        name_run.font.size = Pt(16)
        name_run.font.bold = True
        
        # 其他基本信息
        info_para = doc.add_paragraph()
        info_para.add_run(f"性别: {base_info.get('sex', '')}    ")
        info_para.add_run(f"联系电话: {base_info.get('phone', '')}    ")
        info_para.add_run(f"邮箱: {base_info.get('email', '')}    ")
        info_para.add_run(f"出生日期: {base_info.get('jobinfo_birthdate', '')}")
        info_para.add_run(f"求职意向: {base_info.get('job_objective', '')}")
        info_para.add_run(f"简介: {base_info.get('jobinfo_description', '')}")
        info_para.add_run(f"在职状态: {base_info.get('jobinfo_description', '')}")

    # 教育经历
    doc.add_heading('教育经历', level=2)
    educational = resume_info.get("educational", [])
    if educational:
        for edu in educational:
            edu_para = doc.add_paragraph()
            edu_para.add_run(f"{edu.get('school_name', '')}  {edu.get('professional_name', '')}").bold = True
            edu_para.add_run(f"\n{edu.get('enrollment_time', '')} - {edu.get('graduation_time', '')}")
            edu_para.add_run(f"\n{edu.get('enrollment_time', '')}")

    # 工作经历
    doc.add_heading('工作经历', level=2)
    work_experience = resume_info.get("work_experience", [])
    if work_experience:
        for work in work_experience:
            work_para = doc.add_paragraph()
            work_para.add_run(f"{work.get('workexperience_company', '')}  {work.get('workexperience_position', '')}").bold = True
            work_para.add_run(f"\n{work.get('workexperience_start_date', '')} - {work.get('workexperience_end_date', '')}")
            work_para.add_run(f"\n工作描述: {work.get('workexperience_description', '')}")
            work_para.add_run(f"\n薪资: {work.get('workexperience_salary_range', '')}")
            work_para.add_run(f"\n所属行业: {work.get('workexperience_industry', '')}")

    # 项目经历
    doc.add_heading('项目经历', level=2)
    project_experience = resume_info.get("project_experience", [])
    if project_experience:
        for proj in project_experience:
            doc.add_heading(proj.get('project_name', ''), level=3)
            
            proj_time = doc.add_paragraph()
            proj_time.add_run(f"项目时间: {proj.get('time', '')}").italic = True
            
            doc.add_paragraph(f"项目描述: {proj.get('project_description', '')}")
            doc.add_paragraph(f"技术栈: {proj.get('technology_stack', '')}")
            doc.add_paragraph(f"业务描述: {proj.get('business_description', '')}")
            doc.add_paragraph(f"个人职责: {proj.get('personal_responsibility', '')}")
    
    # 专业技能
    doc.add_heading('专业技能', level=2)
    skills = resume_info.get("professional_skills", {})
    if skills:
        for skill_key, skill_value in skills.items():
            doc.add_paragraph(skill_value)
    
    # 自我评价
    doc.add_heading('自我评价', level=2)
    self_evaluation = resume_info.get("self_evaluation", "")
    if self_evaluation:
        doc.add_paragraph(self_evaluation)
    
    # 保存文件
    # 确保uploads目录存在
    project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    uploads_dir = os.path.join(project_root, 'uploads')
    os.makedirs(uploads_dir, exist_ok=True)
    
    # 生成带时间戳的文件名
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    name = base_info.get('name', 'resume') if base_info else 'resume'
    file_path = os.path.join(uploads_dir, f"{name}_{timestamp}.docx")
    resume_name = f"{name}_{timestamp}.docx"
    
    # 保存文档
    doc.save(file_path)
    
    return file_path,resume_name


if __name__ == '__main__':
    prompt = """
        ## 设定角色
            你是互联网行业资深简历优化专家，熟悉Python开发、产品经理等岗位的简历撰写逻辑，能精准提炼职业亮点。
        ##  任务描述
            生成一个"Python工程师"的简历,这个简历中需要包括以下内容:
            基本信息:姓名 性别 联系方式 邮箱 求职意向 	
            教育经历: 1-2段,每一个段有 学校名称 专业名称 入学毕业 毕业时间 
            工作经历: 1-2段, 公司名称 职位名称 入职时间 离职时间 工作描述
            项目经历: 5-7个项目,每一个项目有 项目名称 时间 项目描述 技术栈 业务描述 个人职责
            专业技能: 里面包括 编程工具 python基础 python底层 数据库 中间件 大模型技术  相关框架 前端技术  测试技术  运维技术
            自我评价:3句话,突出自我优势和亮点即可
        ##  输出格式	
            {
                "base_info":{
                    "name":"字符串[如:张三]",
                    "sex":"字符串[如:男]",
                    "phone":"字符串[如:13263394663]",
                    "email":"字符串[如:123_python@163.com]",
                    "job_objective":"字符串[如:python工程师]"
                },
                "educational":[
                    {
                        "school_name":"字符串[如:北京理工大学]",
                        "professional_name":"字符串[如:计算机科学与技术]",
                        "enrollment_time":"字符串[如:2016年9月]",
                        "graduation_time":"字符串[如:2020年7月]",
                    }
                ],
                "work_experience":[
                    {
                        "company_name":"字符串[如:奥莉巴巴]",
                        "job_title":"字符串[如:python工程师]",
                        "entry_time":"字符串[如:2020年7月]",
                        "departure_time":"字符串[如:2023年8月]",
                        "job_description":"字符串[如:承担核心开发和架构的岗位]"
                    }

                ],
                "project_experience":[
                    {
                        "project_name":"电商供应链库存管理系统",
                        "time":"2023 年 9 月 - 2024 年 3 月",
                        "project_description":"针对原有库存系统高并发下数据不一致、响应延迟问题，重构核心模块，实现库存预占、扣减、回滚的原子化操作，支撑大促期间日均 500 万 + 订单的库存处理需求。",
                        "technology_stack":"Python 3.10、FastAPI、MySQL 8.0（读写分离）、Redis Cluster（分布式锁 / 缓存）、Kafka（消息队列）、Docker、Kubernetes",
                        "business_description":"解决电商大促场景下库存超卖 / 少卖问题，提升库存数据准确性至 99.99%，接口平均响应时间从 200ms 降至 50ms，支撑双 11、618 等大促活动平稳运行。",
                        "personal_responsibility":"1. 独立设计库存预占核心算法，基于 Redis 分布式锁解决并发冲突；2. 优化 MySQL 索引与查询语句，拆分大表（从 1 亿行拆分为 10 个分表）；3. 编写单元测试与压测脚本（Locust），保障系统抗压能力达 5000 QPS；4. 对接采购、仓储团队需求，输出 API 文档并支持联调。"
        }
                ],
                "professional_skills":{
                    "programming_tools":"PyCharm、Git（GitLab/GitHub）、Jenkins（CI/CD）、Docker、Kubernetes、Locust（压测）、Postman（接口调试）、Grafana/Prometheus（监控）",
        "python_basic":"精通 Python 3.x 语法、数据结构（列表 / 字典 / 集合 / 堆）、算法（排序 / 查找 / 动态规划）；熟练掌握并发编程（多线程 threading、多进程 multiprocessing、协程 asyncio/aiohttp）；了解内存管理、异常处理、代码优化（Pylint/Black 规范）",
        "python_underlying":"理解 Python GIL 全局解释器锁原理及规避方案；熟悉 CPython 解释器工作流程（词法分析→语法分析→字节码→执行）；了解字节码指令、垃圾回收机制（引用计数 + 分代回收）；对比过 PyPy 与 CPython 性能差异及适用场景",
        "database":"精通关系型数据库 MySQL/PostgreSQL（索引优化、事务隔离级别、读写分离、分库分表）；熟练使用非关系型数据库 Redis（缓存、分布式锁、消息队列）、MongoDB（文档存储）；了解 OLAP 数据库 ClickHouse、时序数据库 InfluxDB；能编写高效 SQL 语句，解决慢查询问题",
        "middleware":"熟练使用消息队列 Kafka/RabbitMQ（生产者 - 消费者模型、分区 / 队列设计、消息重试）；熟悉搜索引擎 Elasticsearch（索引创建、DSL 查询、聚合分析）；了解 Nginx 反向代理、负载均衡配置；能基于中间件设计高可用、高并发系统架构",
        "large_model_technology":"熟悉大模型微调技术（LoRA/QLoRA）；掌握 LangChain 框架（链、代理、记忆）；了解 RAG 检索增强生成流程（文档加载→分割→embedding→向量存储→检索）；能使用 Prompt Engineering 优化问答效果；有 LLaMA/ChatGLM 模型应用开发经验",
        "relevant_frameworks":"Web 框架：精通 FastAPI（高性能异步）、Flask（轻量），熟悉 Django（全栈）；数据处理：熟练使用 Pandas/NumPy（数据清洗、分析）、PySpark（分布式计算）；ORM 框架：精通 SQLAlchemy；任务调度：熟悉 Airflow/Celery；测试框架：熟练使用 Pytest",
        "frontend_technology":"了解 HTML/CSS 基础语法；熟悉 JavaScript 基本操作；能使用 Vue.js 开发简单前端页面（如后台管理界面）；可独立完成前后端联调（对接 Axios/JSON 数据格式）"
                },
                "self_evaluation":"字符串[如:1. 3 年 Python 开发经验（含 1 年实习），精通后端服务架构设计、高并发处理与性能优化，主导过电商库存、数据平台等核心项目，支撑过日均 10 亿 + 请求场景；2. 兼具后端开发与数据处理能力，熟悉大模型 RAG / 微调技术，能结合业务场景落地技术方案，多次实现业务效率提升 30%+；3. 具备良好的工程化思维（代码规范、测试、监控）与团队协作能力，善于快速定位并解决复杂技术问题，保障系统 99.99% 以上可用性。]"
            }
        """
    resume_info_dict = generate_resume_by_llm(prompt)
    file_path = generate_word_resume(resume_info_dict)
    print(file_path)
